package manager.modulo.funcionario.dao;

import java.sql.SQLException;
import manager.auxiliares.MensagemExcessao;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Timestamp;
import java.util.LinkedList;
import manager.auxiliares.Configurations;
import manager.auxiliares.Format;
import manager.principal.fonte.JanelaLogin;
import manager.interfaces.InterfaceDao;
import manager.modulo.funcionario.enumerator.EnumEscolaridade;
import manager.modulo.funcionario.enumerator.EnumEscolaridade.Escolaridade;
import manager.modulo.funcionario.enumerator.EnumEstadoCivil;
import manager.modulo.funcionario.enumerator.EnumEstadoCivil.EstadoCivil;
import manager.modulo.funcionario.enumerator.EnumSexo;
import manager.modulo.funcionario.enumerator.EnumSexo.Sexo;
import manager.modulo.funcionario.enumerator.EnumSituacaoFuncionario;
import manager.modulo.funcionario.enumerator.EnumSituacaoFuncionario.SituacaoFuncionario;
import manager.modulo.clientefornecedor.enumerator.EnumSituacaoClienteFornecedor;
import manager.modulo.clientefornecedor.enumerator.EnumSituacaoClienteFornecedor.SituacaoClienteFornecedor;
import manager.modulo.clientefornecedor.enumerator.EnumTipoClienteFornecedor;
import manager.modulo.clientefornecedor.enumerator.EnumTipoClienteFornecedor.TipoClienteFornecedor;

/**
 * Esta classe será utilizada para cadastra a entidade user no banco de dados
 *
 * @author Thiago
 */
public class FuncionarioDao implements InterfaceDao {

    private int id;
    private String identificador;
    private String nome;
    private String nomePai;
    private String nomeMae;
    private Timestamp dataNascimento;
    private String carteiraTrabalho;
    private String serieCT;
    private String cpf;
    private String naturalidade;
    private String identidade;
    private String orgaoEmissor;
    private Timestamp dataEmissao;
    private String tituloEleitoral;
    private String zona;
    private String secao;
    private String reservista;
    private String serieReservista;
    private String categoriaReservista;
    private String pis;
    private String nomeConjuge;
    private String telefone;
    private int idProfissao;
    private int idEstadoIdentidade;
    private int idEstadoTituloEleitor;
    private int idEndereco;
    private SituacaoFuncionario situacao;
    private Sexo sexo;
    private Escolaridade escolaridade;
    private EstadoCivil estadoCivil;

    /**
     * Inicializando as variáveis
     */
    public FuncionarioDao() {
        identificador = "";
        nome = "";
        nomePai = "";
        nomeMae = "";
        dataNascimento = new Timestamp(00 - 00 - 00);
        carteiraTrabalho = "";
        serieCT = "";
        cpf = "";
        naturalidade = "";
        identidade = "";
        orgaoEmissor = "";
        dataEmissao = new Timestamp(00 - 00 - 00);
        tituloEleitoral = "";
        zona = "";
        secao = "";
        reservista = "";
        serieReservista = "";
        categoriaReservista = "";
        pis = "";
        nomeConjuge = "";
        telefone = "";
        idProfissao = 0;
        idEstadoIdentidade = 0;
        idEstadoTituloEleitor = 0;
        situacao = SituacaoFuncionario.NAOENCONTRADO;
        sexo = Sexo.NAOIDENTIFICADO;
        escolaridade = Escolaridade.NAOENCONTRADO;
        estadoCivil = EstadoCivil.NAOENCONTRADO;
    }

    public static int getIdFuncionarioByIdentificador(String identificador) {
        try {

            String sql = "SELECT id FROM funcionario WHERE tx_identificador = ?";
            PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
            preparedStatement.setString(1, identificador);
            ResultSet resultSet = preparedStatement.executeQuery();
            int idBuscado = 0;
            if (resultSet.first()) {
                idBuscado = resultSet.getInt("id");
            }
            resultSet.close();
            preparedStatement.close();
            return idBuscado;
        } catch (Exception e) {
            MensagemExcessao.mostrarMensagem(e, "Buscando Funcionários");
            return 0;
        }
    }

    public static int getIdFuncionarioByCPF(String cpf) {
        try {

            String sql = "SELECT id FROM funcionario WHERE tx_cpf = ?";
            PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
            preparedStatement.setString(1, cpf);
            ResultSet resultSet = preparedStatement.executeQuery();
            int idBuscado = 0;
            if (resultSet.first()) {
                idBuscado = resultSet.getInt("id");
            }
            resultSet.close();
            preparedStatement.close();
            return idBuscado;
        } catch (Exception e) {
            MensagemExcessao.mostrarMensagem(e, "Buscando Funcionários");
            return 0;
        }
    }

    public LinkedList<String> buscar(String option, String search, boolean limite) throws SQLException {
        LinkedList<String> result = new LinkedList<String>();
        if (!search.equals("")) {
            String sql = "";
            String tamanhoBusca = limite ? ("LIMIT 0," + Configurations.getAutoCompleteSizeSearch()) : "";
            if (option.equalsIgnoreCase("Nome")) {// Buscando por Nome
                sql = "SELECT tx_nome FROM funcionario WHERE tx_nome LIKE ? ORDER BY tx_nome " + tamanhoBusca;
                search += "%";
            } else if (option.equalsIgnoreCase("Identificador")) {
                sql = "SELECT tx_identificador FROM funcionario WHERE tx_identificador LIKE ? ORDER BY tx_identificador " + tamanhoBusca;
                search += "%";
            }
            if (!sql.equals("")) {
                PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
                preparedStatement.setString(1, search);
                ResultSet resultSet = preparedStatement.executeQuery();
                while (resultSet.next()) {
                    result.add(resultSet.getString(1));
                }
            }
        }
        return result;
    }

    public static LinkedList searchTable(String opcao, String palavraBuscada) throws SQLException {
        LinkedList result = new LinkedList();
        if (!palavraBuscada.equals("")) {
            String sql = "";
            if (opcao.equalsIgnoreCase("Nome")) { // Buscando por nome
                sql = "SELECT "
                        + " f.id as IdFuncionario, "
                        + " f.tx_identificador as Identificador, "
                        + " p.tx_nome as Profissao, "
                        + " f.tx_nome as Nome, "
                        + " f.tx_telefone as Telefone, "
                        + " f.cd_situacao as Situacao "
                        + "FROM "
                        + " funcionario f "
                        + " INNER JOIN profissao p ON p.id = f.id_profissao "
                        + "WHERE "
                        + " f.tx_nome LIKE ? "
                        + "ORDER BY f.tx_nome ";
                palavraBuscada += "%";
            } else if (opcao.equalsIgnoreCase("Identificador")) {
                sql = "SELECT "
                        + " f.id as IdFuncionario, "
                        + " f.tx_identificador as Identificador, "
                        + " p.tx_nome as Profissao, "
                        + " f.tx_nome as Nome, "
                        + " f.tx_telefone as Telefone, "
                        + " f.cd_situacao as Situacao "
                        + "FROM "
                        + " funcionario f "
                        + " INNER JOIN profissao p ON p.id = f.id_profissao "
                        + "WHERE "
                        + " f.tx_identificador LIKE ? "
                        + "ORDER BY f.tx_nome ";
                palavraBuscada += "%";
            }

            if (!sql.equals("")) {
                PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
                preparedStatement.setString(1, palavraBuscada);
                ResultSet resultSet = preparedStatement.executeQuery();

                LinkedList<String> colunaIdentificador = new LinkedList<String>();
                LinkedList<String> colunaNome = new LinkedList<String>();
                LinkedList<String> colunaProfissao = new LinkedList<String>();
                LinkedList<String> colunaTelefone = new LinkedList<String>();
                LinkedList<String> colunaSituacao = new LinkedList<String>();
                LinkedList<Integer> colunaId = new LinkedList<Integer>();

                while (resultSet.next()) {
                    colunaId.add(resultSet.getInt("IdFuncionario"));
                    colunaIdentificador.add(resultSet.getString("Identificador"));
                    colunaNome.add(resultSet.getString("Nome"));
                    colunaProfissao.add(resultSet.getString("Profissao"));
                    colunaTelefone.add(resultSet.getString("Telefone"));
                    colunaSituacao.add(EnumSituacaoFuncionario.ConvertEnumString(EnumSituacaoFuncionario.ConverterNumeroEnum(resultSet.getInt("Situacao"))));
                }

                result.add(colunaId);
                result.add(Format.getBooleanLinkedList(colunaId.size()));
                result.add(colunaIdentificador);
                result.add(colunaNome);
                result.add(colunaProfissao);
                result.add(colunaTelefone);
                result.add(colunaSituacao);
                result.add(Format.getBooleanLinkedList(colunaId.size()));
            }
        }
        return result;
    }

    /**
     * Carregar as informações do objeto usuário a partir de um id
     *
     * @param id Id do usuário buscado
     */
    public void buscar(int id) {
        try {
            setId(id);
            String sql = "SELECT * FROM funcionario WHERE id = ?";
            PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
            preparedStatement.setInt(1, id);
            ResultSet resultSet = preparedStatement.executeQuery();
            if (resultSet.first()) {
                identificador = resultSet.getString("tx_identificador");
                nome = resultSet.getString("tx_nome");
                nomePai = resultSet.getString("tx_nome_pai");
                nomeMae = resultSet.getString("tx_nome_mae");
                dataNascimento = resultSet.getTimestamp("dt_nascimento");
                carteiraTrabalho = resultSet.getString("tx_carteira_trabalho");
                serieCT = resultSet.getString("tx_serie_ct");
                cpf = resultSet.getString("tx_cpf");
                naturalidade = resultSet.getString("tx_naturalidade");
                identidade = resultSet.getString("tx_identidade");
                orgaoEmissor = resultSet.getString("tx_org_emissor");
                dataEmissao = resultSet.getTimestamp("dt_emissao");
                tituloEleitoral = resultSet.getString("tx_titulo_eleitoral");
                zona = resultSet.getString("tx_zona");
                secao = resultSet.getString("tx_secao");
                reservista = resultSet.getString("tx_reservista");
                serieReservista = resultSet.getString("tx_serie_res");
                categoriaReservista = resultSet.getString("tx_categoria_res");
                pis = resultSet.getString("tx_pis");
                nomeConjuge = resultSet.getString("tx_nome_conjuge");
                idProfissao = resultSet.getInt("id_profissao");
                idEstadoIdentidade = resultSet.getInt("id_est_iden");
                idEstadoTituloEleitor = resultSet.getInt("id_est_tit_ele");
                idEndereco = resultSet.getInt("id_endereco");
                telefone = resultSet.getString("tx_telefone");
                situacao = EnumSituacaoFuncionario.ConverterNumeroEnum(resultSet.getInt("cd_situacao"));
                sexo = EnumSexo.ConverterNumeroEnum(resultSet.getInt("cd_sexo"));
                escolaridade = EnumEscolaridade.ConverterNumeroEnum(resultSet.getInt("cd_escolaridade"));
                estadoCivil = EnumEstadoCivil.ConverterNumeroEnum(resultSet.getInt("cd_estado_civil"));
            }
            resultSet.close();
            preparedStatement.close();
        } catch (Exception e) {
            MensagemExcessao.mostrarMensagem(e, "Buscando Funcionários");
        }
    }

    /**
     * Insere um usuário no banco
     */
    public void inserir() throws SQLException {
        String sql = "INSERT INTO funcionario "
                + "(tx_identificador,"
                + " tx_nome,"
                + " tx_nome_pai,"
                + " tx_nome_mae,"
                + " dt_nascimento,"
                + " tx_carteira_trabalho,"
                + " tx_serie_ct,"
                + " tx_cpf,"
                + "tx_naturalidade,"
                + "tx_identidade,"
                + "tx_org_emissor,"
                + "dt_emissao,"
                + "tx_titulo_eleitoral,"
                + "tx_zona,"
                + "tx_secao,"
                + "tx_reservista,"
                + "tx_serie_res,"
                + "tx_categoria_res,"
                + "tx_pis,"
                + "tx_nome_conjuge,"
                + "id_profissao,"
                + "id_endereco,"
                + "id_est_iden,"
                + "id_est_tit_ele,"
                + "cd_situacao,"
                + "cd_sexo,"
                + "cd_escolaridade,"
                + "cd_estado_civil, "
                + "tx_telefone) "
                + "VALUES ("
                + "?," // 01 Identificador
                + "?," // 02 Nome
                + "?," // 03 Pai
                + "?," // 04 Mãe
                + "?," // 05 Dt Nascimento
                + "?," // 06 Carteira de Trabalho
                + "?," // 07 Serie
                + "?," // 08 CPF
                + "?," // 09 Naturalidade
                + "?," // 10 Identidade
                + "?," // 11 Orgão Emissor
                + "?," // 12 Dt Emissão
                + "?," // 13 Titulo Eleitoral
                + "?," // 14 Zona
                + "?," // 15 Secao
                + "?," // 16 Reservista
                + "?," // 17 Serie
                + "?," // 18 Categoria
                + "?," // 19 Pis
                + "?," // 20 Nome Conjugue
                + "?," // 21 Profissao
                + "?," // 22 Endereco
                + "?," // 23 Estado Identidade
                + "?," // 24 Estado Titulo Eleitor
                + "?," // 25 Situação
                + "?," // 26 Sexo
                + "?," // 27 Escolaridade
                + "?," // 28 Estado Civil
                + "?)"; // 29 Telefone
        PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql, PreparedStatement.RETURN_GENERATED_KEYS);

        preparedStatement.setString(1, identificador);
        preparedStatement.setString(2, nome);
        preparedStatement.setString(3, nomePai);
        preparedStatement.setString(4, nomeMae);
        preparedStatement.setTimestamp(5, dataNascimento);
        preparedStatement.setString(6, carteiraTrabalho);
        preparedStatement.setString(7, serieCT);
        preparedStatement.setString(8, cpf);
        preparedStatement.setString(9, naturalidade);
        preparedStatement.setString(10, identidade);
        preparedStatement.setString(11, orgaoEmissor);
        preparedStatement.setTimestamp(12, dataEmissao);
        preparedStatement.setString(13, tituloEleitoral);
        preparedStatement.setString(14, zona);
        preparedStatement.setString(15, secao);
        preparedStatement.setString(16, reservista);
        preparedStatement.setString(17, serieReservista);
        preparedStatement.setString(18, categoriaReservista);
        preparedStatement.setString(19, pis);
        preparedStatement.setString(20, nomeConjuge);
        preparedStatement.setInt(21, idProfissao);
        preparedStatement.setInt(22, idEndereco);
        preparedStatement.setInt(23, idEstadoIdentidade);
        preparedStatement.setInt(24, idEstadoTituloEleitor);
        preparedStatement.setInt(25, EnumSituacaoFuncionario.ConverterEnumNumero(situacao));
        preparedStatement.setInt(26, EnumSexo.ConverterEnumNumero(sexo));
        preparedStatement.setInt(27, EnumEscolaridade.ConverterEnumNumero(escolaridade));
        preparedStatement.setInt(28, EnumEstadoCivil.ConverterEnumNumero(estadoCivil));
        preparedStatement.setString(29, telefone);
        preparedStatement.executeUpdate();

        //Recebendo o novo id gerado
        ResultSet resultSet = preparedStatement.getGeneratedKeys();
        while (resultSet.next()) {
            id = resultSet.getInt(1);
        }

        preparedStatement.close();
        resultSet.close();
    }

    /**
     * Atualiza o usuário no banco
     */
    public void atualizar() throws SQLException {
        String sql = "UPDATE funcionario SET "
                + "     tx_identificador = ? ," // 01
                + "     tx_nome = ? ," // 02
                + "     tx_nome_pai = ? ," // 03
                + "     tx_nome_mae = ? ," // 04
                + "     dt_nascimento = ? ," // 05
                + "     tx_carteira_trabalho = ? ," // 06
                + "     tx_serie_ct = ? ," // 07
                + "     tx_cpf = ? ," // 08
                + "     tx_naturalidade = ? ," // 09
                + "     tx_identidade = ? ," // 10
                + "     tx_org_emissor = ? ," // 11
                + "     dt_emissao = ? ," // 12
                + "     tx_titulo_eleitoral = ? ," // 13
                + "     tx_zona = ?," // 14
                + "     tx_secao = ? ," // 15
                + "     tx_reservista = ? ," // 16
                + "     tx_serie_res = ? ," // 17
                + "     tx_categoria_res = ? ," // 18
                + "     tx_pis = ?," // 19
                + "     tx_nome_conjuge = ? ," // 20
                + "     id_profissao = ? ," // 21
                + "     id_est_iden = ? ," // 22
                + "     id_est_tit_ele = ?,  " // 23
                + "     cd_situacao = ?,  " // 24
                + "     cd_sexo = ?,  " // 25
                + "     cd_escolaridade = ?,  " // 26
                + "     tx_telefone = ?,  " // 27
                + "     cd_estado_civil = ?,  " // 28
                + "     id_endereco = ?  " // 29
                + "WHERE "
                + "     id = ?";                        // 30
        PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
        preparedStatement.setString(1, identificador);
        preparedStatement.setString(2, nome);
        preparedStatement.setString(3, nomePai);
        preparedStatement.setString(4, nomeMae);
        preparedStatement.setTimestamp(5, dataNascimento);
        preparedStatement.setString(6, carteiraTrabalho);
        preparedStatement.setString(7, serieCT);
        preparedStatement.setString(8, cpf);
        preparedStatement.setString(9, naturalidade);
        preparedStatement.setString(10, identidade);
        preparedStatement.setString(11, orgaoEmissor);
        preparedStatement.setTimestamp(12, dataEmissao);
        preparedStatement.setString(13, tituloEleitoral);
        preparedStatement.setString(14, zona);
        preparedStatement.setString(15, secao);
        preparedStatement.setString(16, reservista);
        preparedStatement.setString(17, serieReservista);
        preparedStatement.setString(18, categoriaReservista);
        preparedStatement.setString(19, pis);
        preparedStatement.setString(20, nomeConjuge);
        preparedStatement.setInt(21, idProfissao);
        preparedStatement.setInt(22, idEstadoIdentidade);
        preparedStatement.setInt(23, idEstadoTituloEleitor);
        preparedStatement.setInt(24, EnumSituacaoFuncionario.ConverterEnumNumero(situacao));
        preparedStatement.setInt(25, EnumSexo.ConverterEnumNumero(sexo));
        preparedStatement.setInt(26, EnumEscolaridade.ConverterEnumNumero(escolaridade));
        preparedStatement.setString(27, telefone);
        preparedStatement.setInt(28, EnumEstadoCivil.ConverterEnumNumero(estadoCivil));
        preparedStatement.setInt(29, idEndereco);
        preparedStatement.setInt(30, id);
        preparedStatement.executeUpdate();
        preparedStatement.close();
    }

    public void deletar() throws SQLException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public String getCarteiraTrabalho() {
        return carteiraTrabalho;
    }

    public void setCarteiraTrabalho(String carteiraTrabalho) {
        this.carteiraTrabalho = carteiraTrabalho;
    }

    public String getCategoriaReservista() {
        return categoriaReservista;
    }

    public void setCategoriaReservista(String categoriaReservista) {
        this.categoriaReservista = categoriaReservista;
    }

    public String getCpf() {
        return cpf;
    }

    public void setCpf(String cpf) {
        this.cpf = cpf;
    }

    public Timestamp getDataEmissao() {
        return dataEmissao;
    }

    public void setDataEmissao(Timestamp dataEmissao) {
        this.dataEmissao = dataEmissao;
    }

    public Timestamp getDataNascimento() {
        return dataNascimento;
    }

    public void setDataNascimento(Timestamp dataNascimento) {
        this.dataNascimento = dataNascimento;
    }

    public Escolaridade getEscolaridade() {
        return escolaridade;
    }

    public void setEscolaridade(Escolaridade escolaridade) {
        this.escolaridade = escolaridade;
    }

    public EstadoCivil getEstadoCivil() {
        return estadoCivil;
    }

    public void setEstadoCivil(EstadoCivil estadoCivil) {
        this.estadoCivil = estadoCivil;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getIdEstadoIdentidade() {
        return idEstadoIdentidade;
    }

    public void setIdEstadoIdentidade(int idEstadoIdentidade) {
        this.idEstadoIdentidade = idEstadoIdentidade;
    }

    public int getIdEstadoTituloEleitor() {
        return idEstadoTituloEleitor;
    }

    public void setIdEstadoTituloEleitor(int idEstadoTituloEleitor) {
        this.idEstadoTituloEleitor = idEstadoTituloEleitor;
    }

    public int getIdProfissao() {
        return idProfissao;
    }

    public void setIdProfissao(int idProfissao) {
        this.idProfissao = idProfissao;
    }

    public String getIdentidade() {
        return identidade;
    }

    public void setIdentidade(String identidade) {
        this.identidade = identidade;
    }

    public String getIdentificador() {
        return identificador;
    }

    public void setIdentificador(String identificador) {
        this.identificador = identificador;
    }

    public String getNaturalidade() {
        return naturalidade;
    }

    public void setNaturalidade(String naturalidade) {
        this.naturalidade = naturalidade;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getNomeConjuge() {
        return nomeConjuge;
    }

    public void setNomeConjuge(String nomeConjuge) {
        this.nomeConjuge = nomeConjuge;
    }

    public String getNomeMae() {
        return nomeMae;
    }

    public void setNomeMae(String nomeMae) {
        this.nomeMae = nomeMae;
    }

    public String getNomePai() {
        return nomePai;
    }

    public void setNomePai(String nomePai) {
        this.nomePai = nomePai;
    }

    public String getOrgaoEmissor() {
        return orgaoEmissor;
    }

    public void setOrgaoEmissor(String orgaoEmissor) {
        this.orgaoEmissor = orgaoEmissor;
    }

    public String getPis() {
        return pis;
    }

    public void setPis(String pis) {
        this.pis = pis;
    }

    public String getReservista() {
        return reservista;
    }

    public void setReservista(String reservista) {
        this.reservista = reservista;
    }

    public String getSecao() {
        return secao;
    }

    public void setSecao(String secao) {
        this.secao = secao;
    }

    public String getSerieCT() {
        return serieCT;
    }

    public void setSerieCT(String serieCT) {
        this.serieCT = serieCT;
    }

    public String getSerieReservista() {
        return serieReservista;
    }

    public void setSerieReservista(String serieReservista) {
        this.serieReservista = serieReservista;
    }

    public Sexo getSexo() {
        return sexo;
    }

    public void setSexo(Sexo sexo) {
        this.sexo = sexo;
    }

    public SituacaoFuncionario getSituacao() {
        return situacao;
    }

    public void setSituacao(SituacaoFuncionario situacao) {
        this.situacao = situacao;
    }

    public String getTituloEleitoral() {
        return tituloEleitoral;
    }

    public void setTituloEleitoral(String tituloEleitoral) {
        this.tituloEleitoral = tituloEleitoral;
    }

    public String getZona() {
        return zona;
    }

    public void setZona(String zona) {
        this.zona = zona;
    }

    public int getIdEndereco() {
        return idEndereco;
    }

    public void setIdEndereco(int idEndereco) {
        this.idEndereco = idEndereco;
    }

    public String getTelefone() {
        return telefone;
    }

    public void setTelefone(String telefone) {
        this.telefone = telefone;
    }
}
